home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / xc2103i.lzh / XC2103.XDF / ASK30 / FILES.C < prev    next >
C/C++ Source or Header  |  1993-09-15  |  3KB  |  169 lines

  1. /*
  2. **    FILES for ASK3
  3. **    Copyright (C) 1992  ACCESS CO.,LTD.
  4. */
  5. #include "aci.h"
  6. #include "askkey.h"
  7. typedef unsigned char    u_char;
  8.  
  9. short    acc_main();
  10. u_char    cbuf[80];
  11. MEAN    kbuf[32];
  12. MEAN    mbuf[9];
  13.  
  14. ACC_DEF    acc = {
  15.     KS_EDIT0|KS_EDITING|KS_SELECT,
  16.     NOT_ASCII|CTRL_ON|TOUROKU_KEY,
  17.     acc_main,
  18.     {
  19.         cbuf,    kbuf,    mbuf
  20.     }
  21. };
  22.  
  23. short    acc_main(code)
  24. BIT16    code;
  25. {
  26.     static int    first = 1;
  27.     BIT16        nc, ascii, mask_key();
  28.     u_char        *strcat();
  29.     void        init(), skip(), back(), next(), enter();
  30.  
  31.     if (first) {
  32.         init();
  33.         first = !first;
  34.         return(DF_KWINSTR|DF_MWINSTR|CACI_NORMAL);
  35.     }
  36.     nc = mask_key(code);
  37.     if (!(nc & NOT_ASCII)) {
  38.         ascii = nc & 0xff;
  39.         if ((nc & SHIFT_ON) && (ascii >= 0x20 && ascii <= 0xff)) {
  40.             skip(ascii);
  41.         } else if (nc == '\033') {
  42.             first = 1;
  43.             return(CACI_END);
  44.         } else if (nc == '\r') {
  45.             enter();
  46.             return(DF_OUTSTR|CACI_SUSPEND);
  47.         } else {
  48.             cbuf[0] = nc;
  49.             cbuf[1] = '\0';
  50.               return(DF_OUTSTR|CACI_SUSPEND);
  51.         }
  52.     } else {
  53.         switch(nc) {
  54.           case NOT_ASCII|UP_KEY:
  55.             back();
  56.             break;
  57.           case NOT_ASCII|DOWN_KEY:
  58.             next();
  59.             break;
  60.           case CTRL_ON|NOT_ASCII|XF1_KEY:
  61.             first = 1;
  62.             return(KEY_AGAIN|CACI_END);
  63.             break;
  64.           case NOT_ASCII|CTRL_ON|TOUROKU_KEY:
  65.             first = 1;
  66.             return(CACI_END);
  67.           default:
  68.             break;
  69.         }
  70.     }
  71.     return(DF_KWINSTR|CACI_NORMAL);
  72. }
  73.  
  74. #define MAXFILES    128
  75. static u_char    flist[MAXFILES][23];
  76. static short    fcnt, ftotal;
  77.  
  78. static void    init()
  79. {
  80.     extern u_char    fname[];
  81.     int    files(), nfiles(), sstrtom();
  82.     u_char    *strcpy();
  83.  
  84.     fcnt = ftotal = 0;
  85.  
  86.     /*ディレクトリエントリをバッファに詰める*/
  87.     /*128個を越えたら切る*/
  88.     if (files() == 0) {
  89.         do {
  90.             if (fname[0] == '.')
  91.                 continue;
  92.             strcpy(flist[ftotal++], fname);
  93.         } while (nfiles() == 0 && ftotal <= MAXFILES);
  94.         sstrtom(flist[0], kbuf, 0);
  95.     }
  96.     sstrtom("ファイル選択", mbuf, 0);
  97. }
  98.  
  99. static void    skip(nc)
  100. BIT16    nc;
  101. {
  102.     int    i;
  103.  
  104.     for (i = ((fcnt + 1 >= ftotal) ? 0 : fcnt+1);
  105.         i != fcnt; i = ((i + 1 >= ftotal) ? 0 : i + 1)) {
  106.         if (toupper(nc) == toupper(flist[i][0])) {
  107.             fcnt = i;
  108.             sstrtom(flist[fcnt], kbuf, 0);
  109.             return;
  110.         }
  111.     }
  112. }
  113.  
  114. static int    toupper(int c)
  115. {
  116.     if (c >= 'a' && c <= 'z')
  117.         return(c - 0x20);
  118.     else
  119.         return(c);
  120. }
  121.  
  122. static void    back()
  123. {
  124.     if (fcnt > 0)
  125.         sstrtom(flist[--fcnt], kbuf, 0);
  126. }
  127.  
  128. static void    next()
  129. {
  130.     if (fcnt < ftotal-1)
  131.         sstrtom(flist[++fcnt], kbuf, 0);
  132. }
  133.  
  134. static void    enter()
  135. {
  136.     strcpy(cbuf, flist[fcnt]);
  137. }
  138.  
  139. static BIT16    mask_key(code)
  140. BIT16    code;
  141. {
  142.     code &= (0xff|CTRL_ON|SHIFT_ON|NOT_ASCII);
  143.     if (!(code & NOT_ASCII))
  144.         code &= ~CTRL_ON;
  145.     return(code);
  146. }
  147.  
  148. static u_char *strcpy(s1, s2)
  149. u_char    *s1, *s2;
  150. {
  151.     u_char    *ret = s1;
  152.  
  153.     while (*s1++ = *s2++)
  154.         ;
  155.     return(ret);
  156. }
  157.  
  158. static u_char *strcat(s1, s2)
  159. u_char    *s1, *s2;
  160. {
  161.     u_char    *ret = s1;
  162.  
  163.     while (*s1)
  164.         s1++;
  165.     while (*s1++ = *s2++)
  166.         ;
  167.     return(ret);
  168. }
  169.